package com.kuang.bascic.service;

import com.kuang.bascic.Myexception.BusinessException;
import com.kuang.bascic.utils.MsmUtils;
import com.kuang.bascic.utils.StrUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.mail.javamail.MimeMessageHelper;
import org.springframework.stereotype.Service;

import javax.mail.MessagingException;
import javax.mail.internet.MimeMessage;
import java.io.File;
import java.util.Map;
import java.util.concurrent.TimeUnit;

@Service
public class BaseCodeServiceImpl implements BaseCodeService {
    @Autowired
    private RedisTemplate redisTemplate;
    @Autowired
    private JavaMailSender javaMailSender;
    @Override
    public void sentCode(Map<String, String> map) {
        // 收到前端的手机号码参数 和 获取验证吗的类型
        /**     给用户发送验证吗：
         *          1. 生成4-6位数字随机验证码
         *          2.发送验证码到用户手机号
         *          3.后台存储验证吗
         *          3.1 可以将验证码放在session中 ，但在前后端分离，分布式项目，不适用session
         *          3.2 这里使用redis存放验证码实现对比
         *          redis存储的样子
         *          key                         value
         *          164516：codetype             1464:16366236263  当前时间错
         */

        //生成随机验证码
        String phone = map.get("phone");
        String type = map.get("codetype");
        // 生成随机数验证码
        String code = StrUtils.getRandomString(6);
        String CodeInfo= phone+":"+type;
        // 解决同一分钟内同一用户在同一功能发多次验证码
        // 从redis里查找最近1分钟电话号是否发送过短信验证码
        String codeInforRedis = (String) redisTemplate.opsForValue().get(CodeInfo);
        if (codeInforRedis!=null){ // 说明此电话已经在redis里面
            // 这个值就是redis里面存在的key 截取出来的上一次发送短信的时间戳
            Long value =Long.valueOf(codeInforRedis.split(":")[1]) ;
            // 判断该电话号吗是否在一分钟内请求了两次 通过
            if (System.currentTimeMillis()-value<60*1000){
                // 这抛出异常 controller接住
                throw new BusinessException("操作频繁，请稍后再试");
            }else{// 将两次发送的验证码为一致 并且都有效
                // 将本次验证码设置为上次一致的验证码 但是redis里设置的还是最新的时间戳不影响继续判断 适用于网络延迟
                code = codeInforRedis.split(":")[0];
            }
        }

        //5, TimeUnit.MINUTES 格式化过期时间 5分钟
        redisTemplate.opsForValue().set(CodeInfo,code+":"+System.currentTimeMillis(),5, TimeUnit.MINUTES);
        String o = (String) redisTemplate.opsForValue().get(CodeInfo);
        System.out.println("----------"+o);
        try {
            // 工具类接口发送短信
            MsmUtils.sendCode(phone,code);
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
        System.out.println(code);
    }

    @Override
    public void sentEmailCode(String email,String codetype) {
        //生成代码

        //生成随机验证码
//            String phone = map.get("phone");
//            String type = map.get("codetype");
        // 生成随机数验证码
        String code = StrUtils.getRandomString(6);
        String CodeInfo= email+":"+codetype;
        // 解决同一分钟内同一用户在同一功能发多次验证码
        // 从redis里查找最近1分钟电话号是否发送过短信验证码
        String codeInforRedis = (String) redisTemplate.opsForValue().get(CodeInfo);
        if (codeInforRedis!=null){ // 说明此电话已经在redis里面
            // 这个值就是redis里面存在的key 截取出来的上一次发送短信的时间戳
            Long value =Long.valueOf(codeInforRedis.split(":")[1]) ;
            // 判断该电话号吗是否在一分钟内请求了两次 通过
            if (System.currentTimeMillis()-value<60*1000){
                // 这抛出异常 controller接住
                throw new BusinessException("操作频繁，请稍后再试");
            }else{// 将两次发送的验证码为一致 并且都有效
                // 将本次验证码设置为上次一致的验证码 但是redis里设置的还是最新的时间戳不影响继续判断 适用于网络延迟
                code = codeInforRedis.split(":")[0];
            }
        }
        //5, TimeUnit.MINUTES 格式化过期时间 5分钟
        redisTemplate.opsForValue().set(CodeInfo,code+":"+System.currentTimeMillis(),5, TimeUnit.MINUTES);
        String o = (String) redisTemplate.opsForValue().get(CodeInfo);
        System.out.println("邮件验证码为---"+code);
        try {
            // 复杂邮件发送
            MimeMessage mimeMessage = javaMailSender.createMimeMessage();
            // 新建复杂邮件工具类
            MimeMessageHelper helper = new MimeMessageHelper(mimeMessage,true,"utf-8");
            // 设置发件人
            helper.setFrom("1351100733@qq.com");
            // 邮件主题
            helper.setSubject("宠物之家验证码"+code);
            // 复杂的可以设置上html传参 自动解析
            helper.setText(" <a href=\" http://jibvmg.natappfree.cc/success\">\n" +
                    "    <img src=\"http://https://wx4.sinaimg.cn/orj360/001P0DUIly1h3mykobbnbj61o0280qv502.jpg\" alt=\"\">\n" +
                    "</a>\n",true);
            //设置附件
            helper.addAttachment("js全国空降.rar",new File("E:\\maile\\1.rar"));
            // 设置收件人
            helper.setTo(email);
            // 发送邮件
            javaMailSender.send(mimeMessage);
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }
}
